#!/bin/bash

# 导出Git两次提交之间改动的文件(必须在项目文件夹中执行且有".git目录"-依托git的diff功能进行差异化导出)
# 使用方法: ./export-changes.sh <旧提交哈希-开区间> <新提交哈希-闭区间> [导出目录]

# 检查参数
if [ $# -lt 2 ]; then
    echo "使用方法: $0 <旧提交哈希-开区间> <新提交哈希-闭区间> [导出目录]"
    echo "示例: $0 a1b2c3d4 e5f6g7h8 ./changed-files"
    exit 1
fi

OLD_COMMIT=$1
NEW_COMMIT=$2
EXPORT_DIR=${3:-./git-changes-export}  # 默认导出目录

# 创建导出目录
mkdir -p "$EXPORT_DIR"
echo "将导出改动文件到: $EXPORT_DIR"

# 获取两次提交之间的所有改动文件（包括新增、修改、重命名）
# --name-status 显示文件状态和名称
# --diff-filter=ACMRT 只包含新增(A)、复制(C)、修改(M)、重命名(R)、类型变更(T)的文件
CHANGED_FILES=$(git diff --name-status --diff-filter=ACMRT "$OLD_COMMIT" "$NEW_COMMIT")

# 检查是否有改动文件
if [ -z "$CHANGED_FILES" ]; then
    echo "在 $OLD_COMMIT 和 $NEW_COMMIT 之间没有发现改动文件"
    exit 0
fi

# 遍历每个改动文件并导出
echo "$CHANGED_FILES" | while read -r STATUS FILE; do
    # 处理重命名的文件（格式为 "oldname -> newname"）
    if [[ "$FILE" == *" -> "* ]]; then
        FILE=$(echo "$FILE" | awk -F' -> ' '{print $2}')  # 取新文件名
    fi
    # 检查文件是否存在于新提交中
    if git rev-parse --verify "$NEW_COMMIT:$FILE" >/dev/null 2>&1; then
        # 创建文件所在的目录结构
        FILE_DIR=$(dirname "$FILE")
        mkdir -p "$EXPORT_DIR/$FILE_DIR"
        # 从新提交中导出文件
        git show "$NEW_COMMIT:$FILE" > "$EXPORT_DIR/$FILE"
        echo "[$STATUS] $FILE"
    else
        echo "[已删除] $FILE (未导出)"
    fi
done

echo "操作完成，共导出 $(echo "$CHANGED_FILES" | wc -l) 个改动文件"
